from cachetools import TTLCache
from typing import Optional
from dto.strategy_calculate_result import StrategyCalculateResult


class StrategyResultCache:
    
    _instance = None

    def __new__(cls, maxsize: int = 100, ttl: int = 1800):
        """
        实现单例模式。如果实例已存在，则直接返回该实例。
        """
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 初始化缓存
            cls._instance.cache = TTLCache(maxsize=maxsize, ttl=ttl)
        return cls._instance

    def add(self, key: str, value: StrategyCalculateResult) -> None:
        """
        添加一个 StrategyCalculateResult 对象到缓存。

        :param key: 缓存的键（通常是唯一标识，例如股票代码）。
        :param value: StrategyCalculateResult 对象。
        """
        self.cache[key] = value

    def get(self, key: str) -> Optional[StrategyCalculateResult]:
        """
        从缓存中获取一个 StrategyCalculateResult 对象。

        :param key: 缓存的键。
        :return: 如果存在且未过期，返回对应的对象；否则返回 None。
        """
        return self.cache.get(key)

    def remove(self, key: str) -> None:
        """
        从缓存中移除指定的键。

        :param key: 缓存的键。
        """
        if key in self.cache:
            del self.cache[key]

    def clear(self) -> None:
        """
        清空缓存。
        """
        self.cache.clear()
